package com.ruoyi.merchant.mapper;

import com.ruoyi.merchant.domain.FinancialFlow;
import com.ruoyi.merchant.domain.dto.FlowQueryDTO;
import com.ruoyi.merchant.domain.dto.WithdrawQueryDTO;
import com.ruoyi.merchant.domain.vo.FlowListVO;
import com.ruoyi.merchant.domain.vo.WithdrawRecordVO;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;

/**
 * 财务流水Mapper接口
 */
public interface FinancialFlowMapper {
    
    /**
     * 查询商家余额
     *
     * @param merchantId 商家ID
     * @return 余额
     */
    BigDecimal selectMerchantBalance(@Param("merchantId") Long merchantId);
    
    /**
     * 查询商家名称
     *
     * @param merchantId 商家ID
     * @return 商家名称
     */
    String selectMerchantName(@Param("merchantId") Long merchantId);
    
    /**
     * 查询累计收入
     *
     * @param merchantId 商家ID
     * @return 累计收入
     */
    BigDecimal selectTotalIncome(@Param("merchantId") Long merchantId);
    
    /**
     * 查询累计支出
     *
     * @param merchantId 商家ID
     * @return 累计支出
     */
    BigDecimal selectTotalExpense(@Param("merchantId") Long merchantId);
    
    /**
     * 分页查询流水列表
     *
     * @param query 查询条件
     * @return 流水列表
     */
    List<FlowListVO> selectFlowList(FlowQueryDTO query);
    
    /**
     * 根据ID查询流水详情
     *
     * @param flowId 流水ID
     * @param merchantId 商家ID
     * @return 流水详情
     */
    FinancialFlow selectFlowById(@Param("flowId") Long flowId, 
                                  @Param("merchantId") Long merchantId);
    
    /**
     * 插入流水记录
     *
     * @param flow 流水信息
     * @return 影响行数
     */
    int insertFlow(FinancialFlow flow);
    
    /**
     * 更新商家余额
     *
     * @param merchantId 商家ID
     * @param amount 变动金额（正数为增加，负数为减少）
     * @param oldBalance 旧余额（乐观锁）
     * @return 影响行数
     */
    int updateMerchantBalance(@Param("merchantId") Long merchantId,
                              @Param("amount") BigDecimal amount,
                              @Param("oldBalance") BigDecimal oldBalance);
    
    /**
     * 更新流水状态
     *
     * @param flowId 流水ID
     * @param withdrawalStatus 提现状态
     * @return 影响行数
     */
    int updateFlowWithdrawalStatus(@Param("flowId") Long flowId,
                                    @Param("withdrawalStatus") Integer withdrawalStatus);

    /**
     * 查询提现记录列表
     *
     * @param query 查询条件
     * @return 提现记录列表
     */
    List<WithdrawRecordVO> selectWithdrawList(WithdrawQueryDTO query);

}
